% Tamaño de letra.
\documentclass[11pt,titlepage]{article}

%------------------------------ Paquetes ----------------------------------

% Paquetes:

%Para comentarios multilínea.
\usepackage{verbatim}

% Para tener cabecera y pie de página con un estilo personalizado.
\usepackage{fancyhdr}

% Codificación UTF-8
\usepackage[utf8]{inputenc}

% Castellano.
\usepackage[spanish]{babel}

% Tamaño de página y márgenes.
\usepackage[a4paper,headheight=16pt,scale={0.75,0.8},hoffset=0.5cm]{geometry}

% Para poder agregar notas al pie en tablas:
%\usepackage{threeparttable}

% Tipo de letra Helvetica (Arial).
%\usepackage{helvet}
%\renewcommand\familydefault{\sfdefault}

% Gráficos:

% Para incluir imágenes, el siguiente código carga el paquete graphicx
% según se esté generando un archivo dvi o un pdf (con pdflatex).

% Para generar dv.
%\usepackage[dvips]{graphicx}

% Para generar pdf.
\usepackage[pdftex]{graphicx}
\pdfcompresslevel=9
\pdfminorversion=5
\usepackage{pdfpages}

%
% Directorio donde están las imagenes.
%
%\newcommand{\imgdir}{includes}
%\graphicspath{{\imgdir/}}

%------------------------------ ~paquetes ---------------------------------

%------------------------- Inicio del documento ---------------------------

\begin{document}

% ---------------------- Encabezado y pie de página -----------------------

% Encabezado: sección a la derecha.
% Pie de página: número de página a la derecha.

\pagestyle{fancy}
\renewcommand{\sectionmark}[1]{\markboth{}{\thesection\ \ #1}}
\lhead{}
\chead{}
\rhead{\rightmark}
\lfoot{}
\cfoot{}
\rfoot{\thepage}

% ---------------------- ~Encabezado y pie de página ----------------------

% -------------------------- Título y autor(es) ---------------------------

\title{ConcuDataBase}
\author{}

% -------------------------- ~Título y autor(es) --------------------------

% ------------------------------- Carátula --------------------------------

\begin{titlepage}

\thispagestyle{empty}

% Logo facultad más pie de la figura.
\begin{center}
\includegraphics[scale=0.55]{./img/fiuba}\\
\large{\textsc{Universidad de Buenos Aires}}\\
\large{\textsc{Facultad De Ingeniería}}\\
\small{Año 2011 - 2\textsuperscript{do} Cuatrimestre}
\end{center}

\vfill

% Título central.
\begin{center}

\Large{\underline{\textsc{Técnicas de Programación Concurrente I (75.59)}}}

\vfill

% Tabla de integrantes.

\Large{\underline{\textsc{TP2 - ConcuDataBase}}}

\vfill

\Large\underline{Integrantes} \linebreak\linebreak

% Separación entre columnas.
\large\addtolength{\tabcolsep}{-3pt}
% Tres columnas con alineación centrada.
\begin{tabular}{|| c | c | c ||}
\hline
\textbf{Apellido, Nombre} & \textbf{Nro. Padrón} & \textbf{E-mail} \\
\hline
Bukaczewski, Veronica & 86954 & vero13@gmail.com \\
\hline
Garbarini, Lucia & 88300 & lu.teddy@gmail.com \\
\hline
De Antoni, Matías & 88506 & mdeantoni87@gmail.com \\
\hline
\end{tabular}
\end{center}

\vfill

\hrule
\vspace{0.2cm}

% Pie de página de la carátula.
\noindent\small{75.59 - Técnicas de Programación Concurrente I \hfill}

\end{titlepage}

% ------------------------------- ~Carátula -------------------------------

% -------------------------------- Índice ---------------------------------

% Hago que las páginas se comiencen a contar a partir de aquí.
\setcounter{page}{1}

% Índice.
\tableofcontents
\newpage

% -------------------------------- ~Índice --------------------------------

% ----------------------------- Inicio del tp -----------------------------

\section{Objetivo}

El objetivo del trabajo es realizar el ejercicio 6 de la guía de trabajos prácticos de Mensajes, para comprender la utilización de la cola de mensajes como recurso compartido entre procesos concurrentes. Además se agregan al trabajo condiciones adicionales para la utilización de almacenamiento permanente y de memoria compartida.

\pagebreak
\section{Análisis del problema}
Para el an\'alisis del problema, lo primero que se buscaron fueron los posibles actores que pod\'ia llegar
a tener el sistema, identificandose uno solo que será el usuario del sistema de Gestión de Datos y luego se identificaron los casos de uso. Ver sección \ref{subsec:cu} 

Se entendió el problema a resolver como dos programas que se comunican utilizando una cola de mensajes para intercambiar información sobre las operaciones a realizar sobre la base de datos. Uno será el programa Cliente y otro el programa Servidor. Para la ejecución de las operaciones deberá existir  un protocolo de comunicación en común.

Las condiciones adicionales que se imponen tienen que ver con la utilización de memoria compartida para la manipulación de los datos en memoria , entiendo que se ``prepararía'' el sistema para varios procesos servidores ejecutandose al mismo tiempo y con el manejo de la finalización del proceso , posiblemente mediante señales, para persistir estos datos en memoria a almacenamiento permanente.


\pagebreak
\section{Tareas realizadas}
\begin{enumerate}
 \item Dividir el programa en procesos. El objetivo es lograr que cada programa participante este conformado por un conjunto
 de procesos que sean lo más sencillos posible. \\
  \textbf{Solución:} Los posibles procesos que un programa en ejecucción puede lanzar son:
    \begin{itemize}
     \item Servidor: el proceso servidor es el que está a la escucha de nuevas peticiones por parte de los clientes y las atiende y responde
     \item Cliente: hay un proceso por cada cliente que desea interactuar con el servidor. El proceso cliente envia peticiones y obtiene respuestas.
    \end{itemize}
 
 \item Una vez obtenida la división en procesos, establecer un esquema de comunicación entre ellos teniendo en cuenta los
 requerimientos de la aplicación. ¿Qué procesos se comunican entre sí? ¿Qué datos necesitan compartir para poder trabajar? \\
  \textbf{Solución:} 
    \begin{itemize}
     \item El servidor debe compartir con cada uno de los clientes un canal de comunicacion para poder recibir las consultas a la base de datos y enviar las respuestas.
     \item El servidor debe poder cerrarse de forma ``asíncrona''.
     \item Los distintos posibles procesos del servidor deben poder acceder a la base de datos en memoria principal. Deben sincronizarse y garantizar la exclusion mutua sobre los registros de la base de datos
    \end{itemize}

 \item Tratar de mapear la comunicación entre los procesos a los problemas conocidos de concurrencia. \\
  \textbf{Solución:} 
    \begin{itemize}
	\item La comunicación entre cliente y servidor es el problema de productor-consumidor. Hay dos situaciones: cuando el cliente (productor) envia solicitudes y el servidor ( consumidor ) las recibe, 
	      y la inversa, cuando el servidor ( productor ) envia una respuesta al cliente ( consumidor ).
	\item La comunicación entre el proceso servidor y la base de datos es de tipo lector-escritor. Si bien en este caso se utilizó un único proceso, se modeló considerando que varios procesos disparados por el servidor podrían intentar acceder a la vez a la base de datos-
    \end{itemize}

 \item Determinar los mecanismos de concurrencia a utilizar para cada una de las comunicaciones entre procesos que fueron 
  detectados en el ítem 2. No se requiere la utilización de algún mecanismo espec\'ifico, la elección en cada caso queda
   a cargo del grupo y debe estar debidamente justicada. \\
  \textbf{Solución:} 
    \begin{itemize}
    \item El proceso cliente y servidor se comunican mediante una cola de mensajes, a traves de la cual se envian y contestan peticiones de registros.
    \item El usuario se comunica con el servidor para cerrarlo mediante la señal SIGINT o SIGTERM. 
    \item La base de datos en memoria se implementa mediante una memoria compartida. Se utilizan semáforos para garantizar el acceso en exclusión mutua a los recursos de memoria compartida, siguiendo el modelo de 
	  lectores y escritores con preferencia para lectores.
    \end{itemize}
 
\end{enumerate}

\pagebreak
\section{Diagramas de la aplicación}

\subsection{Diagrama de Casos de Uso}
\begin{figure}[!h]
 \centering
 \includegraphics[scale=0.65]{./img/casos_uso.png}
 % casos_de_uso.png: 548x459 pixel, 72dpi, 19.33x16.19 cm, bb=0 0 548 459
 \caption{Casos de uso}
\end{figure}


\subsection{Especificación de Casos de Uso}
\label{subsec:cu}

\subsubsection{Caso de uso: Eliminar Registro}
\begin{enumerate}
 \item \textbf{Nombre:} Eliminar Registro
 \item \textbf{Descripción:} El objetivo de este caso de uso es eliminar un registro de la base de datos.
 \item \textbf{Actores:} El actor sera el usuario del sistema de gestión de datos.
 \item \textbf{Pre-condiciones:} El registro debe existir en la base de datos.
 \item \textbf{Post-condiciones:} El registro no existe más en la base de datos.
 \item \textbf{Flujo Principal:}
  \begin{enumerate}
   \item El usuario abre la aplicaci\'on.
   \item El usuario utiliza la opci\'on \textit{remove} con el primary key del registro a eliminar.
    \item El sistema  envia la solicitud al servidor y recibe respuesta.
   \item En caso de éxito se obtiene ``Registro removido correctamente''.
   \item En caso de error se obtiene ``Error al intentar remover el registro''. 
  \end{enumerate}

\end{enumerate}


\subsubsection{Caso de uso: Insertar Registro}
\begin{enumerate}
 \item \textbf{Nombre:} Insertar Registro.
 \item \textbf{Descripción:} El objetivo de este caso de uso es dar de alta un registro en la base de datos.
 \item \textbf{Actores:} El actor sera el usuario del sistema de gestión de datos.
 \item \textbf{Pre-condiciones:} El registro que se dará de alta no existe en la base de datos.
 \item \textbf{Post-condiciones:} La base de datos contiene un registro con los datos ingresados.
 \item \textbf{Flujo Principal:}
  \begin{enumerate}
   \item El usuario abre la aplicaci\'on.
   \item El usuario utiliza la opci\'on \textit{insert} con los datos del registro nuevo. Estos datos incluyen nombre, dirección y telefono.
   \item El sistema  envia la solicitud al servidor y recibe respuesta.
   \item En caso de éxito se obtiene ``Registro insertado correctamente''.
   \item En caso de error se obtiene ``Error al intentar insertar el registro''. 
  \end{enumerate}

\end{enumerate}


\subsubsection{Caso de uso: Obtener Registro}
\begin{enumerate}
 \item \textbf{Nombre:} Obtener Registro.
 \item \textbf{Descripción:} El objetivo de este caso de uso es obtener los datos completos de un registro cargado previamente en la base de datos.
 \item \textbf{Actores:} El actor será el usuario del sistema de gestión de datos.
 \item \textbf{Pre-condiciones:} Exista un registro con la primary key dada en la base de datos.
 \item \textbf{Post-condiciones:} -
 \item \textbf{Flujo Principal:}
  \begin{enumerate}
   \item El usuario abre la aplicaci\'on.
   \item El usuario utiliza la opci\'on \textit{get} con la primary key del registro a obtener.
   \item El sistema envia la solicitud al servidor y recibe respuesta.
   \item En caso de éxito se obtiene ``Registro obtenido correctamente'' y luego se listan los datos del registro.
   \item En caso de error se obtiene ``Error al intentar obtener el registro''.
  \end{enumerate}

\end{enumerate}


\subsubsection{Caso de uso: Modificar Registro}
\begin{enumerate}
 \item \textbf{Nombre:} Modificar Registro
 \item \textbf{Descripción:} El objetivo de este caso de uso es modificar los datos guardados en un registro de la base de datos.
 \item \textbf{Actores:} El actor será el usuario del sistema de gestión de datos.
 \item \textbf{Pre-condiciones:} Exista un registro con la primary key dada en la base de datos.
 \item \textbf{Post-condiciones:} El registro tiene sus valores actualizados.
 \item \textbf{Flujo Principal:}
  \begin{enumerate}
   \item El usuario abre la aplicaci\'on.
   \item El usuario utiliza la opci\'on \textit{update} con los nuevos datos del registro.
   \item El sistema  envia la solicitud al servidor y recibe respuesta.
   \item En caso de éxito se obtiene ``Registro actualizado correctamente'' y luego se listan los datos del registro.
   \item En caso de error se obtiene ``Error al intentar actualizar el registro''.
  \end{enumerate}

\end{enumerate}

\newpage
\subsection{Diagrama de Secuencia}
\begin{figure}[!h]
 \centering
 \includegraphics[scale=0.50]{./img/secuencia.png}
 % casos_de_uso.png: 548x459 pixel, 72dpi, 19.33x16.19 cm, bb=0 0 548 459
 \caption{Diagrama de Secuencia}
\end{figure}
Este diagrama de secuencia, muestra la interacción básica entre cliente y servidor por medio de la cola de mensajes. 
El servidor espera por solicitudes hasta que algun cliente envía un mensaje a traves de la cola de mensajes. El servidor procesa la solicitud y envía una respuesta al cliente.
Al inicio el servidor carga la base de datos desde archivo y al finalizar persiste los registros.

\newpage
\subsection{Diagrama de Transición de Estados Servidor}

\begin{figure}[!h]
 \centering
 \includegraphics[scale=0.5]{./img/estados_server.png}
 % casos_de_uso.png: 548x459 pixel, 72dpi, 19.33x16.19 cm, bb=0 0 548 459
 \caption{Diagrama de Transición de Estados : Servidor}
\end{figure}

El servidor inicia cargando la base de datos. Luego se bloquea esperando la llegada de una solicitud de un cliente, la responde y vuelve a esperar. 
Cuando se solicita el cierre del servidor, 

\newpage
\subsection{Diagrama de Clases Cliente}

\begin{figure}[!h]
 \centering
 \includegraphics[angle=90,scale=0.60]{./img/clases_cliente.png}
 % casos_de_uso.png: 548x459 pixel, 72dpi, 19.33x16.19 cm, bb=0 0 548 459
 \caption{Diagrama de Clases : Cliente}
\end{figure}

Los métodos del cliente son invocados por la clase consola, que provee la interacción con el usuario. El cliente se encarga de armar los mensajes para obtener los resultados desde el servidor de manera transparente para la cosola.
A su vez, la clase cliente posee una cola de mensajes mediante la cual envía las solicitudes al servidor.

\newpage
\subsection{Diagrama de Clases Servidor}

\begin{figure}[!h]
 \centering
 \includegraphics[angle=90,scale=0.5]{./img/clases_server.png}
 % casos_de_uso.png: 548x459 pixel, 72dpi, 19.33x16.19 cm, bb=0 0 548 459
 \caption{Diagrama de Clases : Servidor}
\end{figure}
El servidor hereda de proceso ya que se puede lanzar concurrentemente con otros procesos. Posee la base de datos que es quien administra los registros, y la cola de mensajes para la comunicación con el cliente.
La base de datos está formada por una lista de memorias compartidas, donde se agregan bloques dinámicamente a medida que se insertan más registros. Dentro de la memoria compartida se guardan bloques de 160 registros.

\newpage 
\section{Base de datos}
Para la base de datos se utilizaron registros del tipo:
  \begin{verbatim}
    struct DBRegister {

	    char 	name[61];	/* nombre es la "primary key" */
	    char 	address[120];
	    char 	phone[13];
    };
  \end{verbatim}  
Los registros se cargan en memoria compartida para el uso durante la ejecución del servidor. 
Al cerrar el servidor, los registros se guardan en un archivo para ser restaurados en la pr\'oxima ejecución.

Los registros se mantienen en memoria compartida de a bloques de 160 registros; cada bloque está guardado en una memoria compartida diferente y los bloques se crean dinámicamente a medida que se agregan registros


\section{Protocolo de Comunicaci\'on}
El servidor y el cliente se comunican v\'ia la cola de mensajes con mensajes del tipo:
\begin{verbatim}
    struct Message {
	    long 	mtype;		/* tipo de mensaje */
	    long 	dst_mtype;	/* tipo de mensaje de respuesta */
	    int		cmd;		/* comando a ejecutar */
	    DBRegister	reg;		/* registro con el que se trabaja */
    };
\end{verbatim}

Hay una unica cola de mensajes mediante la cual se comunican los clientes con el servidor y viceversa. Esto se logra mediante el uso del campo mtype con distintos valores.
El servidor escucha los requests con el mtype=1, es decir que todos los clientes que se quieran comunicar con el servidor lo deben hacer con un mensaje con mtype 1.\\
El cliente en la request enviada al servidor envia tambien el mtype con el que esperara la respuesta (\textit{dst\_mtype}).  El servidor lee este campo al recibir el request del cliente y cuando arma la respuesta la envia con ese mtype para que el cliente la pueda recibir. 
Cada cliente espera la respuesta escuchando mensajes con un mtype unico, determinado por el pid del proceso cliente. Esto nos garantiza que los mensajes no se mezclaran ya que dos clientes no pueden nunca tener el mismo pid y por lo tanto el mismo mtype.


\begin{description}
\item[Ejemplo Cliente] 
Escucha en la cola de mensajes por mensajes con mtype igual a su pid

El cliente quiere realizar un insert en la base de datos. Envia un mensaje al servidor 
\begin{verbatim}
mtype: 1		-> mtype en el que escucha el servidor
dst_mtype: pid_cliente  -> mtype en la que el cliente escuchara la respuesta
cmd: request_insert	-> id del comando insert.
reg: registro 		-> registro que se quiere insertar en la base dedatos
\end{verbatim}

El cliente quiere obtener un registro de la base de datos. Envia un mensaje al servidor 
\begin{verbatim}
mtype: 1		-> mtype en el que escucha el servidor 
dst_mtype: pid_cliente  -> mtype en la que el cliente escuchara la respuesta
cmd: request_get	-> id del comando insert. 
reg: registro	 	-> registro.name contiene el nombre del registro a obtener.
\end{verbatim}

\item[Ejemplo Servidor] 
El servidor escucha en la cola de mensajes por mensajes con mtype igual a 1.

El servidor contesta un insert
\begin{verbatim}
mtype: pid_cliente	  -> mtype del cliente para que reciba su respuesta
dst_mtype: 1		  -> mtype del server. 
cmd: result		  -> resultado del comando (ok, error, registro-existente)
reg: --- 		  -> en el caso de un insert no se especifica
 \end{verbatim}


El servidor contesta un get
\begin{verbatim}
mtype: pid_cliente	  -> mtype del cliente para que reciba su respuesta
dst_mtype: 1		  -> mtype del server. 
cmd: result		  -> resultado del comando (ok, error)
reg: registro 		  -> registro solicitado
 \end{verbatim}
\end{description}

Los comandos update y remove funcionan de forma similar al insert y get.


\pagebreak
\section{Como usar la aplicaci\'on}
\begin{itemize}
 \item Para compilar el trabajo practico se adjunta un script make.sh que generará dos ejecutables: client y server. (make.sh debe tener permisos de ejecución). Compilar realizando ./make.sh desde la consola
 \item Primero se debe levantar el servidor utilizando el ejecutable ``server''
 \item Luego se debe lanzar la cantidad de clientes que se desee tener en simultáneo.
 \item En la consola de cliente se pueden realizar las siguientes operaciones: 
 	\begin{itemize}
		\item \textbf{insert} Para ello se ingresa la opción -i o --insert seguido de los 3 campos del registro. Estos 3 campos son Nombre-Dirección-Telefono. Ejemplo de utilización: \begin{verbatim}
$-i Anibal CalleFalsa123 47777777
\end{verbatim}
		\item \textbf{get} Para ello se ingresa la opción -g o --get seguido de la clave primaria del registro. Ejemplo de utilización: \begin{verbatim}
$-g Anibal 
\end{verbatim}
		\item \textbf{update} Para ello se ingresa la opción -u o --update seguido de los 3 campos del registro ya que todos serán actualizados. Ejemplo de utilización: \begin{verbatim}
$-u Anibal CalleVerdadera1234 123456879 
\end{verbatim}
		\item \textbf{remove} Para ello se ingresa la opción -r o --remove seguido de la clave primaria del registro. Ejemplo de utilización: \begin{verbatim}
$-r Anibal 
\end{verbatim}
		\item \textbf{quit} Para ello se ingresa la opción -q o --quit. El programa finalizará la ejecución del cliente.
	\end{itemize}
 

 \item El servidor permanecerá abierto hasta que se lo cierre mediante una señal de interrupción como SIGINT o SIGTERM. Para esto el servidor informa su process id al iniciar, con lo cual se puede ejecutar un 
  \begin{verbatim}
    kill -15 pid
  \end{verbatim}  
  También puede cerrarse mediante Ctrl + c. (suponiendo que este shortcut emita alguna de las dos señales mencionadas)

\end{itemize}


%APENDICES
\appendix
\newpage
\includepdf[pages=1-2]{SegundoProyecto.pdf}

% ------------------------------ Fin del tp -------------------------------

\end{document}

%---------------------------- Fin del documento ---------------------------
